﻿/**
 * jQuery EasyUI 1.3.6
 * Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved.
 *
 * Licensed under the GPL or commercial licenses
 * To use it on other terms please contact author: info@jeasyui.com
 * http://www.gnu.org/licenses/gpl.txt
 * http://www.jeasyui.com/license_commercial.php
 *
 * jQuery EasyUI layout Extensions 1.0 beta
 * jQuery EasyUI layout 组件扩展
 * jeasyui.extensions.layout.js
 * 二次开发 流云
 * 最近更新：2014-06-17
 *
 * 依赖项：
 *   1、jquery.jdirk.js v1.0 beta late
 *   2、jeasyui.extensions.js v1.0 beta late
 *
 * Copyright (c) 2013-2014 ChenJianwei personal All rights reserved.
 * http://www.chenjianwei.org
 */
(function($, undefined){

    $.fn.layout.extensions = {
        resizeDelay: 500
    };
    
    
    
    function getPanels(target, withCenter){
        var l = $(target), flag = (withCenter == null || withCenter == undefined) ? true : withCenter, regions = flag ? ["north", "west", "east", "center", "south"] : ["north", "west", "east", "south"];
        return $.array.reduce(regions, function(prev, val, index){
            var p = l.layout("panel", val);
            if (p && p.length) {
                prev.push({
                    region: val,
                    panel: p
                });
                prev[val] = p;
            }
            return prev;
        }, []);
    };
    
    function collapseRegion(l, region){
        var p = l.layout("panel", region);
        if (p && p.length) {
            var opts = p.panel("options");
            if (!opts.collapsed) {
                l.layout("collapse", region);
            }
        }
    };
    
    function collapseAll(target){
        var l = $(target), panels = l.layout("panels", false);
        $.each(panels, function(index, item){
            var opts = item.panel.panel("options");
            if (!opts.collapsed) {
                l.layout("collapse", item.region);
            }
        });
        $.util.exec(function(){
            l.layout("resize");
        }, $.fn.layout.extensions.resizeDelay);
    };
    
    function expandRegion(l, region){
        var p = l.layout("panel", region);
        if (p && p.length) {
            var opts = p.panel("options");
            if (opts.collapsed) {
                l.layout("expand", region);
            }
        }
    };
    
    function expandAll(target){
        var l = $(target), panels = l.layout("panels", false);
        $.each(panels, function(index, item){
            var opts = item.panel.panel("options");
            if (opts.collapsed) {
                l.layout("expand", item.region);
            }
        });
        $.util.exec(function(){
            l.layout("resize");
        }, $.fn.layout.extensions.resizeDelay);
    };
    
    
    function toggle(target, region){
        if (!$.array.contains(["north", "west", "east", "center", "south"], region)) {
            return;
        }
        var l = $(target), p = l.layout("panel", region);
        if (p && p.length) {
            var opts = p.panel("options");
            if (opts.collapsed) {
                l.layout("expand", region);
            }
            else {
                l.layout("collapse", region);
            }
        }
    };
    
    function toggleAll(target, type){
        if (!$.array.contains(["collapse", "expand", "toggle"], type)) {
            type = "toggle";
        }
        var l = $(target), regions = ["north", "west", "east", "south"], hasCollapsed = $.array.some(regions, function(region){
            var p = l.layout("panel", region);
            if (p && p.length) {
                var opts = p.panel("options");
                return opts.collapsed ? true : false;
            }
            else {
                return false;
            }
        }), hasExpanded = $.array.some(regions, function(region){
            var p = l.layout("panel", region);
            if (p && p.length) {
                var opts = p.panel("options");
                return !opts.collapsed ? true : false;
            }
            else {
                return false;
            }
        });
        switch (type) {
            case "collapse":
                l.layout(hasExpanded ? "collapseAll" : "expandAll");
                break;
            case "expand":
                l.layout(hasCollapsed ? "expandAll" : "collapseAll");
                break;
            case "toggle":
                toggleRegions();
                break;
            default:
                toggleRegions();
                break;
        }
        function toggleRegions(){
            $.each(regions, function(i, region){
                l.layout("toggle", region);
            });
            $.util.exec(function(){
                l.layout("resize");
            }, $.fn.layout.extensions.resizeDelay);
        };
        
            };
    function _full(jq){
        return jq.each(function(){
            var layout = $(this);
            var center = layout.layout('panel', 'center');
            center.panel('maximize');
            center.parent().css('z-index', 10);
            $(window).on('resize.full', function(){
                layout.layout('unFull').layout('resize');
            });
        });
    };
    function _unFull(jq){
        return jq.each(function(){
            var center = $(this).layout('panel', 'center');
            center.parent().css('z-index', 'inherit');
            center.panel('restore');
            $(window).off('resize.full');
        });
    };
    
    var defaults = $.fn.layout.extensions.defaults = {};
    
    var methods = $.fn.layout.extensions.methods = {
        full: function(jq){
            return _full(jq);
        },
        unFull: function(jq){
            return _unFull(jq);
        },
        // 扩展 easyui-layout 组件的自定义方法；获取 easyui-layout 组件的所有 panel 面板；
        // 该方法的参数 withCenter 是一个 boolean 类型值，默认为 true；表示返回的数组中是否包含 center panel。
        // 返回值：该方法返回一个 Array 数组对象；数组中的每个元素都是一个包含如下属性定义的 JSON-Object：
        //      region  : String 类型值，表示该面板所在的位置，可能的值为 "north"、"west"、"east"、"center"、"south"；
        //      panel   : jQuery 对象，表示 easyui-panel 面板对象；
        panels: function(jq, withCenter){
            return getPanels(jq[0], withCenter);
        },
        
        //  扩展 easyui-layout 组件的自定义方法；用于折叠 easyui-layout 组件除 center 位置外的所有 panel 面板；
        //  返回值：返回表示当前 easyui-combo layout jQuery 链式对象。
        collapseAll: function(jq){
            return jq.each(function(){
                collapseAll(this);
            });
        },
        
        //  扩展 easyui-layout 组件的自定义方法；用于展开 easyui-layout 组件除 center 位置外的所有 panel 面板；
        //  返回值：返回表示当前 easyui-combo layout jQuery 链式对象。
        expandAll: function(jq){
            return jq.each(function(){
                expandAll(this);
            });
        },
        
        //  扩展 easyui-layout 组件的自定义方法；用于切换 panel 面板的 折叠/展开 状态；该方法定义如下参数：
        //      region: String 类型值，表示要切换 折叠/展开 状态的面板的位置；
        //  返回值：返回表示当前 easyui-combo layout jQuery 链式对象。
        toggle: function(jq, region){
            return jq.each(function(){
                toggle(this, region);
            });
        },
        
        //  扩展 easyui-layout 组件的自定义方法；用于切换所有 panel 面板的 折叠/展开 状态；该方法定义如下参数：
        //      type:   String 类型值，表示在进行 折叠/展开 操作时的操作方式；该参数传入的值限定在以下范围内：
        //          "collapse": 当既有展开的面板也有折叠的面板时，对所有面板执行折叠操作；
        //          "expand"  : 当既有展开的面板也有折叠的面板时，对所有面板执行展开操作；
        //          "toggle"  : 当既有展开的面板也有折叠的面板时，对所有面板执行切换 折叠/展开 状态操作；默认值。
        //  返回值：返回表示当前 easyui-combo layout jQuery 链式对象。
        toggleAll: function(jq, type){
            return jq.each(function(){
                toggleAll(this, type);
            });
        }
    };
	
    $.extend($.fn.layout.defaults, defaults);
    $.extend($.fn.layout.methods, methods);
    
})(jQuery);
